iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
Software Development

闖入DLL的世界 DLL我要進來了哦系列 第 4

第四天:Dll聽話 讓我看看

  • 分享至 

  • xImage
  •  

大家好我是Andy,目前來到了第四天,今天先來看一下Visual Studio動態連結函式庫的原始介面,以及做一個簡單的dll,應該很多人都知道這標題的梗?吧
順便說一下昨天晚上看了一下原價屋RTX3080的價格um.....
其他顯卡集體跳樓
香哇皂啊吃完吐泡泡(絕對不是暴斃的那種)

軟體的部分

  • Visual Studio 2019

使用Visual Studio創建自己屬於自己的DLL

  • StudyPE

觀察程式在執行的過程中調用了哪些動態連結函式庫

Visual Studio 2019

https://visualstudio.microsoft.com/zh-hant/vs/
順便附上載點使用community 2019版本
我們來打開Visual Studio 2019看看她到底長怎麼樣子 (記得不要開到visual studio code每次我都開錯.....)

開啟新的專案

開啟了之後呢點選左上方的檔案>新增>專案

這邊基本上都是選擇 動態連結程式庫,點進動態連結程式庫就會看到這個畫面
這邊分別有兩個檔案一個是 dllmain.cpp另一個是 pch.cpp
進來之後我們可以先看輸出的模式

輸出模式

  • debug

目前都會使用這個,顧名思義就是字面上的意思給偵錯的時候使用,執行速度較快方便偵錯

  • release

上面是偵錯的話那這個也是一樣,全部偵錯完畢沒有錯誤的時候就使用這個比較完整的輸出。
原諒我講廢話

匯出後都會在該專案的檔案內如果使用Debug就會看到Debug的資料夾,使用Release就會看到Release的資料夾

dllmain.cpp


簡單來說這邊就是寫dll的cpp 剛開啟的時候會看到四個東西分別是

  • DLL_PROCESS_ATTACH (DLL文件映射到進程的地址空間)

例如:在main.cpp中我們會使用LoadLibrary這個函數去抓取dll的文件,而通常這個是讀取第一次的時候使用
這也可以說是一個初始化的動作每個動作都會返回一個布林值分別是ture和false而在這個Process_attach如果沒有初始化成功的話會返回false而這時候系統就會自動跑Process_detach去清理那些沒有成功初始化的東西

  • DLL_THREAD_ATTACH

而這個和前面的Process_attach很像但是他們不同的點是,第一次會執行Process_attach但之後第二次開始的時候都會執行這個

  • DLL_THREAD_DETACH

這裡是如果調用ExitThread來結束線程的時候,會通知所有的DLL去執行線程級的清理工作

  • DLL_PROCESS_DETACH

這是初始化的也可以說是卸載動態連結資料庫,通常函數都是使用FreeLibrary(釋放函式庫),配合著LoadLibrary使用因為有加載才有釋放

DIY

我先給他三個函數在其中一個裡面丟一個Messagebox
再由這個dllmain.cpp使用extern函數去做對外宣吿,也就是說我如果我使用exe調用dll我只能抓得到ccc這個函數其他抓不到。

而這邊會看到這邊有顯示紅線,這邊不要緊張,是因為字元集中的Unicode字元集所造成的我們只要把他改成 使用多位元組字元集就可以了


在沒有紅線之後呢就可以建置

這樣子就生成第一個dll了,很簡單吧。

重點整理

  • extern "C" declspec(dllexport) void ccc(); 宣告導出函數,把函數導出到exe檔

非常重要

  • Messagebox有非常多種用法但通常的用法都是

**Messagebox("訊息",按鈕的模式)
按鈕的模式又分成 MB_OK,MB_OKCANCEL,MB_YESNO,MB_YESNOCANCEL
但是在這篇文章中我訊息的後面是文字框的標題

結語

今天我們簡單介紹了visual studio 2019動態連結函式庫的介面以及dllmain裡面的四種載入和釋放的方式,也嘗試了第一次製作dll,下次我們來實際應用在exe檔案去呼叫他試試看吧!,我們明天見。


上一篇
第三天:lib dll .h竟然有三角戀?
下一篇
第五天:lib連結?斷開鎖鏈?不,今天是調用dll「靜態」
系列文
闖入DLL的世界 DLL我要進來了哦30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言